package com.yt.lxh.search.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.yt.lxh.client.product.ProductFeignClient;
import com.yt.lxh.vo.product.SkuVO;
import com.yt.lxh.model.search.SkuDoc;
import com.yt.lxh.search.repository.SkuRepository;
import com.yt.lxh.search.service.SkuService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@Service
public class SkuServiceImpl implements SkuService {

    @Autowired
    private SkuRepository skuRepository;

    @Autowired
    private ProductFeignClient productFeignClient;

    /**
     * 根据商品ID远程调用商品服务获取商品信息
     * 添加商品信息到索引库
     * @param skuId 商品ID
     */
    @Override
    public void upperSku(String skuId) {
        // 发起远程调用
        SkuVO skuVO = productFeignClient.getSkuById(skuId);
        if (skuVO == null) log.info("【搜索微服务】远程调用商品数据成功 ---> 返回为 null，添加索引关闭");
        // es文档赋值
        SkuDoc skuDoc = BeanUtil.copyProperties(skuVO, SkuDoc.class);
        skuDoc.setId(skuVO.getSkuId());
        skuDoc.setKeyword(skuVO.getSkuName());
        // 插入索引库
        skuRepository.save(skuDoc);
        log.info("【搜索微服务】消费消息 ---> 商品：{}，上架 ID：{}", skuVO.getSkuName(), skuId);
    }

    /**
     * 从索引库根据商品ID删除索引
     * @param skuId 商品ID
     */
    @Override
    public void lowerSku(String skuId) {
        skuRepository.deleteById(skuId);
        log.info("【搜索微服务】消费消息 ---> 商品下架 ID：{}", skuId);
    }

    /**
     * 根据关键字搜索商品
     * @param keyword 关键字
     * @return 商品数据
     */
    @Override
    public List<SkuVO> findSkuByKeyword(String keyword) {
        // 从索引库模糊查询，根据权重排序
        List<SkuDoc> skuDocs = skuRepository.findByKeywordContainingIgnoreCaseOrderBySort(keyword);
        List<SkuVO> skuVOS = new ArrayList<>();
        skuDocs.forEach(value -> {
            // 转换数据
            SkuVO skuVO = BeanUtil.copyProperties(value, SkuVO.class);
            skuVO.setSkuId(value.getId());
            skuVOS.add(skuVO);
        });
        return skuVOS;
    }
}
